package com.lcredu.lcrliving.commodity.exception;

import com.lcredu.common.execption.LcrlivingCodeEnume;
import com.lcredu.common.util.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;

/**
 * @author kirito
 * @create 2023-10-04 14:31
 * @ResponseBody: 以json格式返回信息
 * @Slf4j：可以输出日志
 * @ControllerAdvice(basePackages = "com.lcredu.lcrliving.commodity.controller")
 * 表示统一接管controller包下抛出的异常
 */
@Slf4j
@ResponseBody
@ControllerAdvice(basePackages = "com.lcredu.lcrliving.commodity.controller")
public class LcrlivingExceptionControllerAdvice {
    /*
        @ExceptionHandler({MethodArgumentNotValidException.class})
        表示如果com.lcredu.lcrliving.commodity.controller包下抛出了数据校验错误(MethodArgumentNotValidException)
        就由handleValidException进行处理
     */
    @ExceptionHandler({MethodArgumentNotValidException.class})
    public R handleValidException(MethodArgumentNotValidException ex) {
        //输出日志进行观察
        //log.error("数据校验出现问题{}异常类型是{}",ex.getMessage(),ex.getClass());

        //获得bindingResult
        BindingResult bindingResult = ex.getBindingResult();

        HashMap<String, String> map = new HashMap<>();

        //遍历bindingResult将校验错误信息收集
        bindingResult.getFieldErrors().forEach(fieldError -> {
            map.put(fieldError.getField(), fieldError.getDefaultMessage());
        });
        return R.error(LcrlivingCodeEnume.INVALID_EXCEPTION.getCode(),
                LcrlivingCodeEnume.INVALID_EXCEPTION.getMessage()).put("data", map);
    }

    /*
     说明:如果需要根据业务逻辑进行错误捕获，可以单独写方法
     */


    /*
        编写方法处理没有精确匹配到的异常/错误
        返回统一信息
     */
    @ExceptionHandler({Throwable.class})
    public R handleException() {
        return R.error(LcrlivingCodeEnume.UNKNOW_EXCEPTION.getCode(), LcrlivingCodeEnume.UNKNOW_EXCEPTION.getMessage());
    }
}
